#include<stdio.h>
#include<string.h>

//int main()
//{
//  int i = 0;
//  for(i = 0; i < 200; i++)
//  {
//    printf("%d -> %s\n",i,strerror(i));
//  }
//  return 0;
//}

//#include<errno.h>
//int main()
//{
//  FILE *fp = fopen("log.txt","r");//文件打开失败文件不存在
//  if(fp == NULL) return errno;
//  return 0;
//}


//异常终止
//int main()
//{
//  int a = 10;
//  a /= 0;
//  return 89;
//}

//#include<stdlib.h>
//void fun()
//{
//  printf("程序开始\n");
//  exit(40);
//  printf("程序结束\n");
//}
//int main()
//{
//  fun();
//  return 0;
//}

//exit和_exit的区别
//#include<stdlib.h>
//#include<unistd.h>
//int main()
//{
//  printf("hello word");
//  sleep(1);
//  //exit(12);
//  _exit(12);
//  return 0;
//}

//接受制定pid的程序
//#include<sys/wait.h>
//#include<unistd.h>
//#include<stdlib.h>
//int main()
//{
//  pid_t ppid = getppid();
//  pid_t id = fork();
//  pid_t id2 = fork();
//  if(id == 0 && getppid() != ppid)
//  {
//    int cnt = 5;
//    while(cnt)
//    {
//      printf("我是子进程我的pid:%d,ppid:%d\n",getpid(),getppid());
//      sleep(1);
//      cnt--;
//    }
//    exit(0);
//  }
//  if(ppid != getppid())
//  {
//    exit(1);
//  }
//  printf("等待的pid为:%d\n",id);
//  pid_t  rid = waitpid(id,NULL,0);
//  if(rid > 0)
//  {
//    printf("等待成功 -> rid:%d\n",rid );
//  }
//  return 0;
//
//}
//进程等待失败
//#include<sys/wait.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<errno.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int cnt = 5;
//    while(cnt)
//    {
//      printf("我是子进程我的pid:%d,ppid:%d\n",getpid(),getppid());
//      sleep(1);
//      cnt--;
//    }
//    exit(0);
//  }
//  sleep(10);
//  pid_t  rid = waitpid(id + 1,NULL,0);
//  if(rid > 0)
//  {
//    printf("rid:%d\n",rid );
//  }
//  else 
//  {
//    printf("等待失败,退出码:%d,退出信息:%s\n",errno,strerror(errno));
//  }
//  sleep(10);
//  return 0;
//}



//输出型参数status
//#include<sys/wait.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<errno.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int cnt = 5;
//    while(cnt)
//    {
//      printf("我是子进程我的pid:%d,ppid:%d\n",getpid(),getppid());
//      cnt--;
//    }
//    exit(1);
//  }
//  int status = 0;
//  pid_t  rid = waitpid(id,&status,0);
//  if(rid > 0)
//  {
//    printf("rid:%d,status:%d\n",rid,status);
//  }
//  sleep(10);
//  return 0;
//}
//非阻塞调用的阻塞场景
//#include<sys/wait.h>
//#include<unistd.h>
//#include<stdlib.h>
//typedef void (*func_t)();
//#define NUM 5
//func_t head[NUM+1];
//void RegisterHead(func_t head[],func_t f)
//{
//  int i = 0;
//  for(; head[i]; i++);
//  if(i == NUM) return;
//  head[i] = f;
//  head[i + 1] = NULL;
//}
//
//void DownLoad()
//{
//  printf("下载任务。。。\n");
//}
//void Flush()
//{
//  printf("刷新任务。。。\n");
//}
//int main()
//{
//  RegisterHead(head,DownLoad);
//  RegisterHead(head,Flush);
//  pid_t id = fork();
//  if(id == 0)
//  {
//    int cnt = 5;
//    while(cnt)
//    {
//      printf("我是子进程我的pid:%d,ppid:%d\n",getpid(),getppid());
//      sleep(1);
//      cnt--;
//    }
//    exit(0);
//  }
//  while(1)
//  {
//
//    pid_t  rid = waitpid(id,NULL,WNOHANG);
//    if(rid > 0)
//    {
//      printf("进程等待成功\n");
//      break;
//    }
//    else if(rid == 0)
//    {
//      printf("本轮等待结束,子进程未退出\n");
//      int i = 0;
//      for(;head[i];i++)
//      {
//        head[i]();
//      }
//      sleep(1);
//    }
//    else 
//    {
//      printf("进程等待失败\n");
//      break;
//    }
//  }
//  return 0;
//}


//execl
//#include<stdio.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<wait.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    printf("子进程开始执行\n");
//    execl("/usr/bin/ls","ls","-l",NULL);
//    printf("子进程执行结束\n");
//    exit(1);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序执行完毕\n");
//  return 0;
//}
//execlp
//#include<stdio.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<wait.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    printf("子进程开始执行\n");
//    execlp("ls","ls","-l",NULL);
//    printf("子进程执行结束\n");
//    exit(1);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序执行完毕\n");
//  return 0;
//}

//execle
//#include<stdio.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<wait.h>
//int main()
//{
//  pid_t id = fork();
//  char* envp[] = {
//    (char*) "NAME=ZHANGSAN"
//  };
//  if(id == 0)
//  {
//    printf("子进程开始执行\n");
//    execle("/usr/bin/env","env",NULL,envp);
//    printf("子进程执行结束\n");
//    exit(1);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序执行完毕\n");
//  return 0;
//}
//execle全局环境变量
//#include<stdio.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<wait.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//  putenv("HHH=ZHANGSAN");
//  extern char** environ;
//    printf("子进程开始执行\n");
//    execle("/usr/bin/env","env",NULL,environ);
//    printf("子进程执行结束\n");
//    exit(1);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序执行完毕\n");
//  return 0;
//}
//execv
//#include<stdio.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<wait.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    char* argv[] = {
//      (char*)"ls",
//      (char*)"-l",
//      NULL
//    };
//    printf("子进程开始执行\n");
//    execv("/usr/bin/ls",argv);
//    printf("子进程执行结束\n");
//    exit(1);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序执行完毕\n");
//  return 0;
//}
//execvp
//#include<stdio.h>
//#include<unistd.h>
//#include<stdlib.h>
//#include<wait.h>
//int main()
//{
//  pid_t id = fork();
//  if(id == 0)
//  {
//    char* argv[] = {
//      (char*)"ls",
//      (char*)"-l",
//      NULL
//    };
//    printf("子进程开始执行\n");
//    execvp(argv[0],argv);
//    printf("子进程执行结束\n");
//    exit(1);
//  }
//  waitpid(-1,NULL,0);
//  printf("程序执行完毕\n");
//  return 0;
//}
//execvpe
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<wait.h>
int main()
{
  pid_t id = fork();
  if(id == 0)
  {
    char* argv[] = {
      (char*)"env",
      NULL
    };
    putenv((char*)"HHH=liSi");
    extern char** environ;
    printf("子进程开始执行\n");
    execvpe(argv[0],argv,environ);
    printf("子进程执行结束\n");
    exit(1);
  }
  waitpid(-1,NULL,0);
  printf("程序执行完毕\n");
  return 0;
}
